package com.soms.service.impl;

import cn.hutool.json.JSONUtil;
import com.soms.dao.RoleDao;
import com.soms.dao.UserDao;
import com.soms.dao.impl.RoleDaoImpl;
import com.soms.dao.impl.UserDaoImpl;
import com.soms.entity.Role;
import com.soms.service.RoleService;
import com.soms.util.DBUtil;
import com.soms.util.DateUtil;
import com.soms.util.PageInfo;
import com.soms.util.ResultUtil;

import java.sql.Connection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class RoleServiceImpl implements RoleService {

    private final RoleDao roleDao = new RoleDaoImpl();

    private final UserDao userDao = new UserDaoImpl();

    /**
     * 条件分页查询
     *
     * @param page
     * @return
     */
    @Override
    public PageInfo<Role> queryPage(PageInfo<Role> page) {
        Connection connection = DBUtil.getConnection();
        // 查询符合条件的总数量
        Map<String, Object> params = page.getParams();
        int totalCount = roleDao.queryTotalCountByParams(connection, params);
        page.setTotalCount(totalCount);
        // 查询符合条件的当前页数据集合
        List<Role> roles = roleDao.queryPage(connection, page);
        page.setData(roles);
        DBUtil.closeConnection(connection);
        return page;
    }

    /**
     * 新增一个角色
     *
     * @param roleCode
     * @param roleName
     * @param creator
     * @return
     */
    @Override
    public String add(String roleCode, String roleName, Integer creator) {
        if (roleCode == null || roleCode.isEmpty()) {
            return JSONUtil.toJsonStr(ResultUtil.fail("请填写角色编码"));
        }
        if (roleName == null || roleName.isEmpty()) {
            return JSONUtil.toJsonStr(ResultUtil.fail("请填写角色名称"));
        }
        // 判断角色编码是否重复
        Connection connection = DBUtil.getConnection();
        Map<String, Object> params = new HashMap<>();
        params.put("roleCode", roleCode);
        if (roleDao.queryTotalCountByParams(connection, params) > 0) {
            return JSONUtil.toJsonStr(ResultUtil.fail("角色编码已存在"));
        }
        // 构建新增的角色对象
        Role role = new Role(roleCode, roleName);
        role.setCreator(creator);
        role.setCreated(DateUtil.nowDateTimeString());
        int result = roleDao.insert(connection, role);
        DBUtil.closeConnection(connection);
        if (result > 0) {
            return JSONUtil.toJsonStr(ResultUtil.success());
        } else {
            return JSONUtil.toJsonStr(ResultUtil.error());
        }
    }

    /**
     * 通过id查询单个角色
     *
     * @param id
     * @return
     */
    @Override
    public String queryById(int id) {
        Connection connection = DBUtil.getConnection();
        Role role = roleDao.queryById(connection, id);
        DBUtil.closeConnection(connection);
        if (role == null) {
            return JSONUtil.toJsonStr(ResultUtil.fail("数据已不存在"));
        } else {
            return JSONUtil.toJsonStr(ResultUtil.success(null, role));
        }
    }

    /**
     * 更新一个角色
     *
     * @param id
     * @param roleCode
     * @param roleName
     * @param modifier
     * @return
     */
    @Override
    public String update(int id, String roleCode, String roleName, Integer modifier) {
        if (roleCode == null || roleCode.isEmpty()) {
            return JSONUtil.toJsonStr(ResultUtil.fail("请填写角色编码"));
        }
        if (roleName == null || roleName.isEmpty()) {
            return JSONUtil.toJsonStr(ResultUtil.fail("请填写角色名称"));
        }
        // 判断角色编码是否重复
        Connection connection = DBUtil.getConnection();

        // 获取原本数据
        Role old = roleDao.queryById(connection, id);
        // 如果跟原本没变化
        if (Objects.equals(old.getRoleCode(), roleCode) && Objects.equals(old.getRoleName(), roleName)) {
            return JSONUtil.toJsonStr(ResultUtil.fail("没有变化"));
        }
        // 如果角色编码变化
        if (!Objects.equals(old.getRoleCode(), roleCode)) {
            Map<String, Object> params = new HashMap<>();
            params.put("roleCode", roleCode);
            // 新的角色编码跟其他的数据是否一样
            if (roleDao.queryTotalCountByParams(connection, params) > 0) {
                return JSONUtil.toJsonStr(ResultUtil.fail("角色编码已存在"));
            }
        }
        // 构建一个更新的角色对象
        Role role = new Role(roleCode, roleName);
        role.setId(id);
        role.setModifier(modifier);
        role.setModified(DateUtil.nowDateTimeString());
        int result = roleDao.update(connection, role);
        if (result > 0) {
            return JSONUtil.toJsonStr(ResultUtil.success());
        } else {
            return JSONUtil.toJsonStr(ResultUtil.error());
        }
    }

    /**
     * 通过id删除单个角色
     *
     * @param id
     * @return
     */
    @Override
    public String deleteById(int id) {
        Connection connection = DBUtil.getConnection();
        // 先判断这个角色是否被用户所占用
        if (userDao.queryCountByRoleId(connection, id) > 0) {
            return JSONUtil.toJsonStr(ResultUtil.fail("当前角色被用户所使用，请先修改这部分用户信息"));
        }
        // 删除
        int result = roleDao.deleteById(connection, id);
        if (result > 0) {
            return JSONUtil.toJsonStr(ResultUtil.success());
        } else {
            return JSONUtil.toJsonStr(ResultUtil.fail("数据已不存在"));
        }
    }

    /**
     * 获取所有的角色
     *
     * @return
     */
    @Override
    public List<Role> getAllRole() {
        Connection connection = DBUtil.getConnection();
        List<Role> allRole = roleDao.getAllRole(connection);
        DBUtil.closeConnection(connection);
        return allRole;
    }
}
